#include "riscv.h"
#include "memlayout.h"
#include "dev/timer.h"


__attribute__ ((aligned (16))) uint8 CPU_stack[4096 * NCPU];
void main();
// extern void timervec();
//添加定义

void start()
{
  // 将M模式的“之前的特权模式”（MPP）设置为S模式（Supervisor Mode），以便mret指令返回到S模式。
    unsigned long x = r_mstatus();//读取 mstatus 寄存器的当前值

    x &= ~MSTATUS_MPP_MASK;
    x |= MSTATUS_MPP_S;
    w_mstatus(x);


  // 设置M模式的异常程序计数器（mepc）为main的地址，以便mret指令返回到main。
  // 需要编译时使用 -mcmodel=medany 选项，以确保代码适用于不同内存地址。
    w_mepc((uint64)main);
    
    // 暂时禁用分页，直接物理地址映射。
    w_satp(0);

  // 将所有中断和异常委托给S模式处理（S模式可以处理它们）。
    w_medeleg(0xffff);// 委托所有的异常
    w_mideleg(0xffff);// 委托所有的中断
    w_sie(r_sie() | SIE_SEIE | SIE_STIE | SIE_SSIE); // 启用S模式的外部、时钟和软件中断

  // 请求时钟中断（初始化时钟）。
    timer_init();

  // 将当前CPU的hartid存入tp寄存器，以便后续使用cpuid()函数获取CPU ID。
    int id = r_mhartid();
    w_tp(id);

  // 切换到S模式并跳转到main()。
    asm volatile("mret");

}

